
import java.util.Scanner;
import java.text.DecimalFormat;
import java.util.GregorianCalendar;
 

public class ParkingLotManagementSystem {
 
	private ArrayStack S = new ArrayStack(10);// 存放停车场上的车辆信息，假设停车场只有100个位置
	private LinkedListQueue Q = new LinkedListQueue();// 存放便道上的车辆信息
	private double fee = 2;// 每分钟停车费用
	public final static int DEPARTURE = 0;// 标识车辆离开
	public final static int ARRIVAL=1;//标识车辆到达
	

	//停车场管理，license表示车牌号，action表示车辆的动作，到达或离开
	public void parkingManage(String license,String action) throws Exception{
		if("arrive".equals(action)){//到达
			CarInfo info=new CarInfo();
			info.license=license;//记录车牌号
			if(S.getSize() < 10){//停车场未满
				info.arrTime=(GregorianCalendar)GregorianCalendar.getInstance();//当前时间初始化到达时间
				info.state=ARRIVAL;
				S.push(info);//进入停车场
				System.out.println(info.license+"停放在停车场第"+S.getSize()+"个位置！");
			}
			else {//停车场已满
				Q.enqueue(info);//进入便道
				System.out.println(info.license+"停放在便道第"+Q.getSize()+"个位置！");
			}
		}
		else if("depart".equals(action)){//车辆离开
			CarInfo info=null;
			int location=0;//用于记录车辆位置
			if(S.contains(license)){//离开的车辆在停车场中
				//构造一个新栈存储因车辆离开而导致的其他车辆暂时退出停车场
				ArrayStack S2=new ArrayStack(S.getSize());
				for(int i=S.getSize();i>0;i--){
					info=(CarInfo)S.pop();
					if(info.license.equals(license)){//如果排到了真要出去的车辆
						//当前时间初始化离开时间
						info.depTime=(GregorianCalendar)GregorianCalendar.getInstance();
						info.state=DEPARTURE;
//						info.parkInfo.setParkSpace(S.getSize());
						location=i;
						break;
					}
					else
						S2.push(info);//其他车辆暂时退出车场
				}
				while(!S2.isEmpty()){
					//其他车辆重新进入车场
					S.push(S2.pop());
				}
				if(location!=0){//停车场内存在指定车牌号的车辆
					//计算停放时间，并把毫秒换成分钟
					double time=(info.depTime.getTimeInMillis()-info.arrTime.getTimeInMillis())/(1000*60);
					DecimalFormat df=new DecimalFormat("0.0");//对double进行格式化保留两位小数
					System.out.println("车牌号为："+info.license+",\n停放车位号："+location+","+"\n共停放了："+df.format(time)+"分钟,\n费用为："+df.format(time*fee)+"元");
				}
				if(!Q.isEmpty()){
					info=(CarInfo)Q.dequeue();
					info.arrTime=(GregorianCalendar)GregorianCalendar.getInstance();
					info.state=ARRIVAL;
					S.push(info);
					System.out.println(location+"号停车位有空位了,"+info.license+"从便道进入停车场"+location+"位置停车！");
				}


			}
			CarInfo carInfo = (CarInfo) Q.containsAndremove(license);
			if(carInfo != null){//离开的车辆在便道中
//				Q.dequeue(info);//进入便道
				System.out.println(carInfo.license+"停放在便道,现已离开");

			}

		}
	}
	
	public static void main(String[] args) throws Exception {
		ParkingLotManagementSystem plms=new ParkingLotManagementSystem();
		for(int i=1;i<=12;i++){
			plms.parkingManage("桂A0000"+String.valueOf(i), "arrive");
		}
		Scanner sc=new Scanner(System.in);
		System.out.println("请输入车牌号");
		String license=sc.next();
		System.out.println("arrive or depart??");
		String action=sc.next();
		plms.parkingManage(license, action);
	}
 
}
